package trees;/*
* 根据一棵树的中序遍历与后序遍历构造二叉树。

注意:
你可以假设树中没有重复的元素。

例如，给出

中序遍历 inorder = [9,3,15,20,7]
后序遍历 postorder = [9,15,7,20,3]
返回如下的二叉树：

    3
   / \
  9  20
    /  \
   15   7

来源：力扣（LeetCode）
链接：https://leetcode-cn.com/problems/construct-binary-tree-from-inorder-and-postorder-traversal
著作权归领扣网络所有。商业转载请联系官方授权，非商业转载请注明出处。
* */

import beans.TreeNode;

import java.util.HashMap;
import java.util.Map;

public class BuildBinaryTreeByInPost {

    Map<Integer, Integer> indexMap = new HashMap<>();
    public TreeNode buildTree(int[] inorder, int[] postorder) {

        if(inorder == null || postorder == null || inorder.length < 1 || postorder.length < 1){
            return null;
        }
        int index = postorder.length - 1;

        for(int i = 0; i< inorder.length; i ++){
            indexMap.put(inorder[i], i);
        }
        return build(postorder, 0, index, index);
    }

    public TreeNode build(int[] postorder, int start, int end, int postIndex){
        TreeNode node = new TreeNode(postorder[postIndex]);
        if(start < end){

            int mid = indexMap.get(postorder[postIndex]);
            if(mid > start) {
                node.left = build(postorder, start, mid - 1, postIndex - end + start - 1);
            }
            if(mid < end) {
                node.right = build(postorder, mid + 1, end, postIndex - 1);
            }
        }

        return node;
    }
}
